import { defineStore } from 'pinia';
import { ref } from 'vue';

/** 后端接口地址 */
const SERVER_BASEURL = import.meta.env.VITE_SERVER_BASEURL;

/** 后端接口代理状态 */
export interface ProxyState {
  [key: string]: string;
}

/** 初始状态 */
const initState: ProxyState = {
  api: SERVER_BASEURL,
  'signin-': SERVER_BASEURL,
  signalr: SERVER_BASEURL,
  file: SERVER_BASEURL,
  upload: SERVER_BASEURL,
};

/** 后端接口代理存储 */
export const useProxyStore = defineStore(
  'app-proxy',
  () => {
    /** 后端接口代理信息 */
    const state = ref<ProxyState>({ ...initState });

    /** 根据 url 获取特定的后端接口 */
    const get = (url: string) => {
      let proxyUrl = '';
      const urlLower = url.toLowerCase();
      if (urlLower.startsWith('http')) {
        return url;
      }
      const proxyMap = state.value;
      Object.keys(proxyMap).forEach((key) => {
        if (urlLower.startsWith(`/${key}`)) {
          proxyUrl = proxyMap[key];
        }
      });
      return proxyUrl;
    };

    /** 根据 url 封装特定后端接口的 url */
    const join = (url: string) => {
      const urlLower = url.toLowerCase();
      if (urlLower.startsWith('http')) {
        return url;
      }
      const proxyMap = state.value;
      Object.keys(proxyMap).forEach((key) => {
        if (urlLower.startsWith(`/${key}`)) {
          url = `${proxyMap[key]}${url}`;
        }
      });
      return url;
    };

    /** 设置后端接口 */
    const set = (val: ProxyState) => {
      state.value = { ...state.value, ...val };
    };
    /** 设置 api 接口 */
    const setApi = (val: string) => {
      state.value = { ...state.value, api: val };
    };
    /** 设置 signin 接口 */
    const setSignin = (val: string) => {
      state.value = { ...state.value, 'signin-': val };
    };
    /** 设置 signalr 接口 */
    const setSignalr = (val: string) => {
      state.value = { ...state.value, signalr: val };
    };
    /** 设置 file 接口 */
    const setFile = (val: string) => {
      state.value = { ...state.value, file: val };
    };
    /** 设置 upload 接口 */
    const setUpload = (val: string) => {
      state.value = { ...state.value, upload: val };
    };
    /** 重置后端代理 */
    const reset = () => {
      state.value = { ...initState };
    };

    return {
      /** 后端接口代理信息 */
      state,
      /** 根据 url 获取特定的后端接口 */
      get,
      /** 根据 url 封装特定后端代接口的 url */
      join,
      /** 设置后端接口 */
      set,
      /** 设置 api 接口 */
      setApi,
      /** 设置 signin 接口 */
      setSignin,
      /** 设置 signalr 接口 */
      setSignalr,
      /** 设置 file 接口 */
      setFile,
      /** 设置 upload 接口 */
      setUpload,
      /** 重置 */
      reset,
    };
  },
  {
    persist: true, // 如果需要持久化就写 true, 不需要持久化就写 false（或者去掉这个配置项）。
  },
);
